﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using System.Text.RegularExpressions;

namespace tpsmi1002
{
    public partial class frmModificationTransactioncs : Form
    {
        Transaction t;
        Stock selectedStock;
        ListView lvTransactions;
        int activeErrorProviders; // compteur pour connaitre combien d'error providers sont toujours visible

        public frmModificationTransactioncs(Transaction _t, ListView _lv)
        {
            InitializeComponent();
            lvTransactions = _lv;
            t = _t;
        }

        private void frmModificationTransactioncs_Load(object sender, EventArgs e)
        {
            selectedStock = t.Stock;
            txtSymbole.Text = selectedStock.Symbol;
            txtQuantite.Text = t.Quantity.ToString();
            txtPrixAchat.Text = t.PurchasePrice.ToString();
            dtpDateAchat.Value = t.PurchaseDate;
        }

        // trigger du bouton enregistrer
        private void btnAjouterTransaction_Click(object sender, EventArgs e)
        {
            if (this.activeErrorProviders == 0 && MessageBox.Show("Voulez-vous vraiment enregistrer les modifications?", "Confirmez la modification.", MessageBoxButtons.YesNoCancel) == DialogResult.Yes)
            {
                Controller.saveModification(t, (Stock)selectedStock, (DateTime)dtpDateAchat.Value, int.Parse(txtQuantite.Text), double.Parse(txtPrixAchat.Text, CultureInfo.InvariantCulture));
                Controller.loadListTransactions(lvTransactions);
                this.Close();
            }   
        }

        // trigger du bouton annuler
        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        // trigger de validation du textbox de stock
        private void txtSymbole_TextChanged(object sender, EventArgs e)
        {
            if (IsSymbolValid())
            {
                epSymbole.Clear();
                SetNbrVisibleEP(-1);
            }
            else
            {
                epSymbole.SetError(txtSymbole, "La symbole entrée est invalide.");
                SetNbrVisibleEP(1);
            }
        }

        // triggerde validation du datetimepicker pour date d'achat
        private void dtpDateAchat_Validating(object sender, CancelEventArgs e)
        {
            if (IsDateValid())
            {
                epDate.Clear();
                SetNbrVisibleEP(-1);
            }
            else
            {
                epDate.SetError(dtpDateAchat, "La date entrée est invalide.");
                SetNbrVisibleEP(1);
            }
        }

        // trigger de validation du txtbox de quantite
        private void txtQuantite_Validated(object sender, EventArgs e)
        {
            if (IsQuantityValid())
            {
                epQte.Clear();
                SetNbrVisibleEP(-1);
            }
            else
            {
                epQte.SetError(txtQuantite, "La quantité entrée est invalide.");
                SetNbrVisibleEP(1);
            }
        }

        // trigger de validation du txtbox de prix d'achat
        private void txtPrixAchat_Validated(object sender, EventArgs e)
        {
            if (IsPriceValid())
            {
                epPrix.Clear();
                SetNbrVisibleEP(-1);
            }
            else
            {
                epPrix.SetError(txtPrixAchat, "Le prix entrée est invalide.");
                SetNbrVisibleEP(1);
            }
        }

        private bool IsSymbolValid()
        {
            if (txtSymbole.Text == "")
                return false;

            if (selectedStock == null)
                return false;

            return true;
        }

        private bool IsDateValid()
        {
            return (dtpDateAchat.Value <= DateTime.Now);
        }

        private bool IsPriceValid()
        {
            var regex = @"^\d{0,5}(\.\d{0,2})?$";

            if (txtPrixAchat.Text == "")
                return false;

            if (!Regex.IsMatch(txtPrixAchat.Text, regex))
                return false;

            double prix = double.Parse(txtPrixAchat.Text, CultureInfo.InvariantCulture);
            if (prix <= 0.00)
                return false;

            return true;
        }

        private bool IsQuantityValid()
        {
            var regex = @"^[0-9]{0,6}$";

            if (txtQuantite.Text == "")
                return false;

            if (!Regex.IsMatch(txtQuantite.Text, regex))
                return false;

            if (int.Parse(txtQuantite.Text) <= 0)
                return false;

            return true;
        }

        // fonction qui sert a connaitre le nombre d'error provider toujours visible sur la fenetre, cad qu'il y a des donnees non-valide
        private void SetNbrVisibleEP(int i)
        {
            if (i == 1)
                this.activeErrorProviders++;
            else if (i == -1 && this.activeErrorProviders > 0)
                this.activeErrorProviders--;
        }
    }
}
